package com.micromsg.basic.config;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

@Aspect
//@Component
public class MyAspect {
    //@Before注解用于定义在特定切点上执行的逻辑。execution(* com.example.yourpackage..*Controller.*(..))表示匹配所有以Controller结尾的类中的所有方法。

    @Before("execution(* com.micromsg..*Controller.*(..))")
    public void beforeControllerMethod() {
        // 在Controller方法执行之前执行的逻辑
        System.out.println("AOP Aspect: Before Controller Method");
    }

    //@Before: 这是一个通知类型的注解，表示在目标方法执行之前执行。
    //execution(* com.example.yourpackage..*Controller.*(..)): 这是一个切点表达式，它指定了切点的位置。具体来说，它表示匹配所有以 Controller 结尾的类中的所有方法。
    //解释切点表达式的各个部分：
    //
    //execution: 表达式的关键字，用于指定方法执行的时机。
    //*: 匹配任意返回类型。
    //com.example.yourpackage..: 包路径，表示在 com.example.yourpackage 包及其子包中。
    //*Controller: 匹配以 Controller 结尾的类。
    //*..*: 匹配任意方法名，包含任意参数。

    @Around("execution(* com.micromsg..*Controller.*(..))")
    public Object aroundControllerMethod(ProceedingJoinPoint joinPoint) throws Throwable {
        // 在方法执行前的逻辑
        System.out.println("AOP Aspect: Before entering Controller Method");

        // 获取方法参数
        Object[] args = joinPoint.getArgs();
        if (args != null && args.length > 0) {
            System.out.println("Method arguments: ");
            for (Object arg : args) {
                System.out.println(arg);
            }
        }

        // 执行目标方法
        Object result = joinPoint.proceed();

        // 在方法执行后的逻辑
        System.out.println("AOP Aspect: After Controller Method");

        // 返回目标方法的结果
        return result;
    }
    //@Around注解允许你在目标方法执行前和执行后都执行通知，并且你可以访问方法的参数和返回值。
    //@Around注解的方法接受一个ProceedingJoinPoint参数，它允许你在通知中调用目标方法。在方法执行前，我们打印了方法参数，然后调用joinPoint.proceed()执行目标方法。在方法执行后，我们打印了一条日志。请注意，@Around注解的通知方法需要返回目标方法的结果。
}
